<?php
namespace Mob \ Model;

use Think \ Model;
use Think \ Hook;
/**任务模型
 * Class InfoModel
 */

require_once ('./Application/Mob/Common/function.php');

class TaskModel extends Model {



	/**
	 * CreateTask  创建任务
	 * @param $Uid
	 * @param $content
	 * @param int $comment_id
	 * @return bool
	 * @author:wanghongyan
	 */
	public function CreateTask($Uid, $Serialno, $TaskType, $TaskTitle, $TaskContents, $TaskDesc, $personnelnum, $tasklimit, $latitude, $longitude, $Tasklongitude, $Tasklatitude) {

		$data = array (
				'taskTitle' => $TaskTitle, //任务标题
		'taskType' => $TaskType, //任务类型,1=单人任务,2为双人任务
	'taskContents' => $TaskContents,
			'taskDesc' => $TaskDesc,
			'releaseUserId' => $Uid,
			'latitude' => $latitude,
			'longitude' => $longitude,
			'tasklimit' => $tasklimit,
			'tasklongitude' => $Tasklongitude,
			'tasklatitude' => $Tasklatitude,
			'personnelnum' => $personnelnum,
			'taskSerialno' => $Serialno,


		);
		if (!$data)
			return false;
		if ($this->add($data)) {

			return true;
		} else {

			return false;
		}
	}
	/**
	 * QueryTask  查询任务
	 * @param $Serialno 流水号
	 * @param $Uid       用户ID
	 * @return $TaskInfo  返回任务信息
	 * @author:wanghongyan
	 */
	public function QueryTask($Serialno) {

		$where['taskSerialno'] = $Serialno;
//		$where['releaseUserId'] = $Uid;
		$where['taskStatus'] = array (
			'neq',
			9
		); //任务状态不能为已经被删除状态

		$TaskInfo = M("task")->where($where)->field("taskSerialno,taskTitle,PayStatus,taskContents,deliverMoney,taskCreateTime,taskDesc,PayStatus,PayMode,OrderId,isFree,releaseTime,releaseUserId,taskStatus,latitude,longitude,tasklimit,personnelnum,taskSerialno,browseCount,IsackAccep,ReplyCount,IsComplete,applyAckTime,realityAckTime,ackCompleteCegree,ackCompleteMode,ackCompleteDesc,IsAppraiser,CloseTime,cancelId,ackAcceptSerialno")->find();

		return $TaskInfo;

	}
	/**
	 * QueryTask  更新任务
	 * @param $Serialno 流水号
	 * @param $Uid       用户ID
	 * @return $TaskInfo  返回任务信息
	 * @author:wanghongyan
	 */
	public function UpdateTask($Serialno, $Uid, $data) {
		$where = array (
			'taskSerialno' => $Serialno,
			'releaseUserId' => $Uid
		);
		$TaskInfo = M("Task");
		return $TaskInfo->where($where)->save($data);

	}

	/**
	* 主页面显示
	* return  0=任务不存在，1=设置佣金成功,2=任务已经被支付了
	*/

	public function commissionSetting($Serialno, $Uid, $PayMode, $Money) {
		$where = array (
			'taskSerialno' => $Serialno,
			'releaseUserId' => $Uid
		); //拼写where查询条件
		$TaskInfo = M("task")->where($data)->field("taskStatus,PayStatus,taskSerialno")->find(); //从表里面查询任务信息。
		if (!$TaskInfo) //如果订单不存在
			{
			return 0; //返回0代表订单不存在
		}
		elseif ($TaskInfo['PayStatus'] == 0 && $TaskInfo['taskStatus'] == 0) ///任务和支付状态都为没有支付，认为要执行支付操作。
		{
			$data['deliverMoney'] = $Money; //任务金额
			$data['PayMode'] = $PayMode; //支付类型
			$data['PayStatus'] = 2; //更新支付任务为待支付状态
			$data['taskStatus'] = 6; //更新任务状态为待支付。
			$Task = M("task");
			if ($Task->where($where)->save($data)) //执行更新操作
				{
				return 1;
			} else {
				return 99;
			}

		}
		elseif ($TaskInfo['taskStatus'] == 1 && $TaskInfo['PayStatus'] == 1) {
			return 2; //订单已经被支付了
		}
		elseif ($TaskInfo['taskStatus'] == 6 && $TaskInfo['PayStatus'] == 2) {
			return 1; //订单已经被支付了
		} else {
			return 3; ///查询订单状态异常。
		}

	}

	private function toPayTask($TaskSerialno) {
		$where['taskSerialno'] = $TaskSerialno; //拼写where信息
		$data['taskStatus'] = 7; //标记为任务状态已经付款
		$data['PayStatus'] = 1; //标记支付状态为已支付
		$Task = M("Task");
		$result = $Task->where($where)->save($data);

	}
	/**
	 * myTasks  我的任务
	 * @param $Uid       用户ID
	 * @param $TaskType   1=我发布进行中的任务,1=我发布的已经完成的任务，3=我接受的正在进行中的任务，4=我接受的已经完成的任务,0=代表所有任务
	 * @return $TaskInfo  返回任务信息
	 * @author:wanghongyan
	 */
	public function myTasks($Uid='',$TaskType=0) {
       $Uid=$Uid?$Uid:get_uid();  //判断一下是否传递UID信息，如果没有的话，调用get_uid方法获取。
       $Tasks = M('Task')->where();




	}
	/**
	 * releaseTask  发布任务
	 * @param $TaskSerialno   任务流水号
	 * @return $result  返回操作状态
	*/
	public function releaseTask($TaskSerialno) {


		$data['taskStatus'] = 1; //设置任务状态为发布状态
		$data['releaseTime'] = getDateTime();

		$Task = M("Task"); //实例化task模型
		$result = $Task->data($data)->where("taskSerialno = '%s' and PayStatus = '1' and taskStatus = '8'  ",$TaskSerialno)->save($data);
		if ($result) //判断是否更新成功
			{
			return true;
		} else {
			return false;
		}

	}
	/**
	 * getTaskDetail  获取任务详情
	 * @param $TaskSerialno       任务流水号
	 * @return 任务详情  返回任务信息
	*/
	public function getTaskDetail($Serialno) {
		$task = M('task')->where("taskSerialno = '%s' and taskStatus <> 9 ",$Serialno)->field('taskTitle,taskStatus,taskType,taskContents,deliverMoney,taskCreateTime,taskDesc,PayStatus,PayMode,OrderId,isFree,releaseTime,releaseUserId,latitude,longitude,tasklimit,personnelnum,taskSerialno,actualCompleteTime,ackAcceptSerialno,browseCount,IsackAccep,ReplyCount,IsComplete,applyAckTime,realityAckTime,ackCompleteCegree,ackCompleteMode')->find();
		if (!$task) {
			return null;
		} else {
			return $task;
		}
	}
	/**
	 * TaskHall  任务大厅
	 * @param $position[] latitude,longitude      位置信息
	 * @param $data   任务查询条件
	 * @param $distance 距离默认为5000米
	 * @return 任务详情  返回任务信息
	*/

	public function TaskHall($position,$data = '', $distance = 50000) {
		$task = new \ Think \ Model();
		if(!$position)
		{
		$latitude  = 43.823696;
		$longitude =125.276993;
		}else
		{
		$latitude = $position['latitude']; //   $latitude=43.886841;
		$longitude = $position['longitude']; //   $longitude=125.3245;
		}

		// $result = $task->query('select  * from ocenter_task where 8000 <  round(6378.138*2*asin(sqrt(pow(sin( (43.886841*pi()/180-latitude*pi()/180)/2),2)+cos(43.886841*pi()/180)*cos(latitude*pi()/180)* pow(sin( (125.3245*pi()/180-longitude*pi()/180)/2),2)))*1000);');
		// $result = $task->query('select * from (select  taskTitle,taskStatus,taskType,taskContents,deliverMoney,taskCreateTime,taskDesc,PayStatus,PayMode,OrderId,isFree,releaseTime,releaseUserId,latitude,longitude,tasklimit,tasklongitude,tasklatitude,personnelnum,taskSerialno,actualCompleteTime,ackAcceptSerialno from __PREFIX__task where taskStatus =1 AND  '.$distance.' <  round(6378.138*2*asin(sqrt(pow(sin( ('.$latitude.'*pi()/180-latitude*pi()/180)/2),2)+cos('.$latitude.'*pi()/180)*cos(latitude*pi()/180)* pow(sin( ('.$longitude.'*pi()/180-longitude*pi()/180)/2),2)))*1000)) as TaskHall');
	//	$result = $task->query('select * from ( select  round(6378.138*2*asin(sqrt(pow(sin( (43.886841*pi()/180-latitude*pi()/180)/2),2)+cos(43.886841*pi()/180)*cos(latitude*pi()/180)* pow(sin( (125.3245*pi()/180-longitude*pi()/180)/2),2)))*1000) as distance ,taskTitle,taskStatus,taskType,taskContents,deliverMoney,taskCreateTime,taskDesc,PayStatus,PayMode,OrderId,isFree,releaseTime,releaseUserId,latitude,longitude,tasklimit,tasklongitude,tasklatitude,personnelnum,taskSerialno,actualCompleteTime,ackAcceptSerialno from ocenter_task
	//	where taskStatus=1 and  AND  ' . $distance . ' <  round(6378.138*2*asin(sqrt(pow(sin( (' . $latitude . '*pi()/180-latitude*pi()/180)/2),2)+cos(' . $latitude . '*pi()/180)*cos(latitude*pi()/180)* pow(sin( (' . $longitude . '*pi()/180-longitude*pi()/180)/2),2)))*1000))as TaskHall');
	//

	//$result = $task->query('select * from (select round(6378.138*2*asin(sqrt(pow(sin( ('.$latitude.'*pi()/180-latitude*pi()/180)/2),2)+cos('.$latitude.'*pi()/180)*cos(latitude*pi()/180)* pow(sin( ('.$longitude.'*pi()/180-longitude*pi()/180)/2),2)))*1000), taskTitle,taskStatus,taskType,taskContents,deliverMoney,taskCreateTime,taskDesc,PayStatus,PayMode,OrderId,isFree,releaseTime,releaseUserId,latitude,longitude,tasklimit,tasklongitude,tasklatitude,personnelnum,taskSerialno,actualCompleteTime,ackAcceptSerialno from __PREFIX__task where taskStatus =1 AND  '.$distance.' <  round(6378.138*2*asin(sqrt(pow(sin( ('.$latitude.'*pi()/180-latitude*pi()/180)/2),2)+cos('.$latitude.'*pi()/180)*cos(latitude*pi()/180)* pow(sin( ('.$longitude.'*pi()/180-longitude*pi()/180)/2),2)))*1000)) as TaskHall');
  //    $result = $task->query('select * from ( select round(6378.138*2*asin(sqrt(pow(sin( ('.$latitude.'*pi()/180-latitude*pi()/180)/2),2)+cos('.$latitude.'*pi()/180)*cos(latitude*pi()/180)* pow(sin( ('.$longitude.'*pi()/180-longitude*pi()/180)/2),2)))*1000) as distance ,taskTitle,taskStatus,taskType,taskContents,deliverMoney,taskCreateTime,taskDesc,PayStatus,PayMode,OrderId,isFree,releaseTime,releaseUserId,latitude,longitude,tasklimit,tasklongitude,tasklatitude,personnelnum,taskSerialno,actualCompleteTime,ackAcceptSerialno,browseCount,IsackAccep from __PREFIX__task where taskStatus=1 and  '.$distance.' > round(6378.138*2*asin(sqrt(pow(sin( ('.$latitude.'*pi()/180-latitude*pi()/180)/2),2)+cos('.$latitude.'*pi()/180)*cos(latitude*pi()/180)* pow(sin( ('.$longitude.'*pi()/180-longitude*pi()/180)/2),2)))*1000))as TaskHall order by distance;');
 //
  $result = $task->query('select * from ( select round(6378.138*2*asin(sqrt(pow(sin( ('.$latitude.'*pi()/180-latitude*pi()/180)/2),2)+cos('.$latitude.'*pi()/180)*cos(latitude*pi()/180)* pow(sin( ('.$longitude.'*pi()/180-longitude*pi()/180)/2),2)))*1000) as distance ,taskTitle,taskStatus,taskType,taskContents,deliverMoney,taskCreateTime,taskDesc,PayStatus,PayMode,OrderId,isFree,releaseTime,releaseUserId,latitude,longitude,tasklimit,tasklongitude,tasklatitude,personnelnum,taskSerialno,actualCompleteTime,ackAcceptSerialno,browseCount,IsackAccep from __PREFIX__task where taskStatus=1 )as TaskHall order by distance;');
   print_r(M()->getLastSql()."<br>");
		return $result;

	}
	/**
	 * TaskHall  添加任务浏览记录
	 * @param $Serialno  任务流水号
	 * @param $Uid       查看任务ID
	 * @return 添加状态   true=成功,false=失败
	*/

    public function AddTaskBrowse($Serialno='',$Uid='')
    {
     $Serialno = $Serialno?$Serialno:I('taskSerialno');
     $Uid=$Uid?$Uid:get_uid();
     $Browse = D('Browse'); //实例化浏览模型
     $result=$Browse->AddBrowseLog(U(),1,$Uid,$Serialno); //添加浏览记录
     if($result)  //判断一下添加游览记录结果是否为真
     {
     $where['taskSerialno']=$Serialno;  //拼写where
     $Task = M('Task');   //实例化task模型
     $res = $Task->where($where)->setInc('browseCount',1);  //执浏览记录数+1
     if($res)  //如果为真
     {
     return true;  //返回true
     }else
     {
     return false;  //否则返回false
     }

     }else
     {
     return false;
     }
    }
    /**
	 * TaskHall  任务是否被受理
	 * @param $Serialno  任务流水号
	 * @return 已受理状态   1=已受理,2=未被受理,0=查询失败
	*/

    public function IsAccep($Serialno)
    {
     $task = M('Task');
     $result = $task->where(" taskSerialno = '%s' and taskStatus in (1,5) ",$Serialno)->field('IsackAccep')->find()['IsackAccep'];


     if($result==1)
     {
     return 1;
     }elseif($result==0)
     {
     return 2;
     }else
     {
     return 0;
     }

    }
    /**
	 * IsLook  任务锁定
	 * @param $Serialno  任务流水号
	 * @param $Uid   用户Uid	 *
	 * @return 锁定状态
	*/
    public function TaskLook($Serialno,$Uid)
    {
     $result = $this->QueryTask($Serialno,$Uid);  //查询任务信息
     if(!$result)    //判断发下如果返回为空，直接返回false
     {
     return false;    //返回false
     }
     if($result['taskStatus']==1)  //判断一下任务状态是否为发布状态
     {
     if($result['IsackAccep']==1)  //判断任务已否已经受理
     {
     return false;      //如果已经受理过了，则直接返回false
     }
     $Accept = D('accept');
     $count = $Accept->GetTaskapplyCount($Serialno);  //取受理表取一下任务受理人数
     if($count==0)
     {
     $data['taskStatus']=11; //更新任务状态为锁定
     $task = M('task');
     $res = $task->data($data)->where("taskSerialno = '%s' and releaseUserId = '%s' and taskStatus = '1' ",$Serialno,$Uid)->save();  //执行更新操作。
     if($res)  //判断更新状态
     {
     return true;   //返回true
     }else
     {
     return false;//返回false
        }
       }
     }
    }


    /**
	 * IsLook  任务是否被锁定
	 * @param $Serialno  任务流水号
	 * @return 锁定状态   true=已锁定 false=未锁定
	*/
    public function IsLook($Serialno)
    {
     $Task = M('Task');//实例化模型
     $result = $Task->where("taskSerialno='%s' and taskStatus ='11'  ",$Serialno)->find();
     if($result)
     {
     return true;
     }else
     {
     return false;
     }

    }
     /**
	 * getDisplayMode  取任务查看模式
	 * @param $Serialno  任务流水号
	 * @param $Uid       用户ID
	 * @return 查看状态   0=非本人发布，任务可以正常申请,1=任务已经被选择，不能申请,2=已经申请过任务了，不能再次申请,3=任务已经被锁定，不能申请,4=自己发布的任务，不能申请,5=判断异常
	*/
    public function getDisplayMode($Serialno,$Uid)
    {
    $result = $this->QueryTask($Serialno,$Uid);  //取任务信息

    if($result['releaseUserId']==$Uid)  //如果任务创建人与UID相符，则说明是自己发布的任务
    {
    return 4; //返回4
    }elseif($result['IsackAccep']==1) //判断任务是否已经被选择
    {
    return 1;   //返回1
    }elseif($result['taskStatus']==11)  //如果任务状态为锁定状态
    {
    return 	3;  //返回3
    }
    $accept = D('Accept');
    $IsAccept = $accept->IsAccept($Serialno,$Uid);  //判断员工是否已经申请过
    if($IsAccept)
    {
    return 2;  //返回2
    }else
    {
    return 0;
    }
    }
     /**
	 * UnLook  解锁
	 * @param $Serialno  任务流水号
	 * @param $Uid       用户ID
	 * @return 查看状态   true =成功,false=失败
	*/
    public function UnLook($Serialno,$Uid)
    {
     $Task = M('Task');//实例化模型
     $result = $Task->where("taskSerialno='%s' and taskStatus ='11' and releaseUserId = '%s' ",$Serialno,$Uid)->find();  //查询任务是否处于锁定状态
     if($result)  //锁定状态
     {

      $data['taskStatus']=1;  //设置更新的内容
      $res = $Task->data($data)->where("taskSerialno = '%s' and releaseUserId = '%s' ",$Serialno,$Uid)->save();  //执行更新操作。
     if($res)  //判断更新状态
     {
     return true;   //返回true
     }else
     {
     return false;//返回false
        }
     }

    }
    /**
	 * confirmTask  确认完成任务
	 * @param $Serialno  任务流水号
	 * @param $Uid       用户ID
	 * @param acceptSerialno  受理流水号
	 * @return 查看状态   true =成功,false=失败
	*/
    public function confirmTask($TaskSerialno,$Uid,$AcceptSerialno,$ackCompleteMode,$ackCompleteCegree)
    {

    $data['IsackAccep']=4;
    $data['realityAckTime']=
    $data['ackAcceptSerialno']=$AcceptSerialno;


    $result = $task->data($data)->where(" taskSerialno = '%s' and releaseUserId = '%s' and taskStatus = '1' and IsackAccep = '0' ",$TaskSerialno,$Uid,$AcceptSerialno)->save();
    if($result)
    {
    return true;
    }else
    {
    return false;
    }
    }
     /**
	 * checkStatus  检查任务状态
	 * @param $Serialno  任务流水号
	 * @param $Status     任务状态
	 * @return 验证状态   true =成功,false=失败
	*/
   public function checkStatus($Serialno,$Status)
   {

   	$result = M('task')->where(" taskSerialno = '%s' and taskStatus = '%s' ",$Serialno,$Status)->find();

   	if($result)
   	{
   	return true;
   	}else
   	{
   	return false;
   	}
   }
   /**
	 * IsAuthTask  检查是否有创建任务权限
	 * @param $Serialno  任务流水号
	 * @return 验证状态   true =成功,false=失败
	*/
   public function IsAuthTask($Uid)
   {
   	//功能先不设计 直接返回true。后续功能预留。
    return true;
   }
    /**
	 * IsAuthTask  受理操作
	 * @param $Serialno  任务流水号
	 * @param $AcceptSerialno  受理流水号
	 * @return 操作结果   true =成功,false=失败
	*/
   public function AcceptOperate($Serialno,$AcceptSerialno)
   {
   	$isAccept = $this->QueryTask($Serialno)['IsackAccep'];  //取是否受理状态标识
   	if($isAccept==0)
   	{
   	$data['IsackAccep']=1;   //设置更新状态为已确认
   	$data['ackAcceptSerialno']=$AcceptSerialno;
   	$data['taskStatus']=5; //更新任务状态为进行中，任务状态为5
    return M('Task')->data($data)->where("taskSerialno = '%s' and taskStatus <> 9 ",$Serialno)->save();

   	}else
   	{
   	return false;
   	}

   }

   public function TaskOperLog($Serialno,$OperateType,$OperUid,$OperFlg,$ext='')
   {
   	$Operatelog = D('Mob/OperateLog');
   	$data['TaskSerialno']=$Serialno;
   	$data['OperateType']=$OperateType;
   	$data['OperateUid']=$operUid;
   	$data['OperateFlg']=$OperFlg;
   	$data['Ext']=$ext;
   	$Operatelog->write($data);
    }
    /**
	 * IsAck  检查任务是否已经确认受理了
	 * @param $Serialno  任务流水号
	 * @return 是否已经受理   true =成功,false=失败
	*/

    public function IsAck($Serialno)
    {
    $Flg = $taskinfo = $this->QueryTask($Serialno)['IsackAccep'];
    if($Flg==1)
    {
    return true;
    }else
    {
    return false;
    }

    }
     /**
	 * confirmComplete  完成确认
	 * @param $Serialno  任务流水号
	 * @param $AcceptSerialno  受理流水号
	 * @param $ackCompleteMode   确认方式  1=人工确认，2=时间到期系统自动确认。
	 * @return 是否已经受理   true =成功,false=失败
	*/

    public function confirmComplete($Serialno,$AcceptSerialno,$ackCompleteMode,$ackCompleteCegree,$ackCompleteDesc)
    {
    $where['taskSerialno']=$Serialno;   //条件任务流水号
    $where['ackAcceptSerialno']=$AcceptSerialno;   //条件确认受理流水号
    $where['taskStatus']=3;   //条件中任务状态为3待确认状态
    $data['taskStatus']=4;   //设置任务已经确认完成
    $data['realityAckTime']=getDateTime();  ///更新任务确认完成时间
    $data['ackCompleteMode']=$ackCompleteMode;  //更新确认模式
    $data['ackCompleteCegree']=$ackCompleteCegree;  //更新确认完成等级
    $data['IsComplete']=1;  //更新是否完成标识为已经完成。
    $data['ackCompleteDesc']=$ackCompleteDesc;

    return $result = $this->where($where)->save($data);


    }
    /**
	 * applyconfirm  申请确认任务
	 * @param $Serialno  任务流水号
	 * @param $AcceptSerialno  受理流水号
	 * @return 申请状态   true =申请成功,false=申请失败
	*/

   public function applyconfirm($TaskSerialno,$AcceptSerialno)
   {
   	$data['taskStatus']=3;// 更新任务状态类型为待确认。
   	$data['applyAckTime']=getDateTime();  ///更新申请时间为当前时间。
   	$result = $this->where("taskSerialno = '%s' and ackAcceptSerialno = '%s' and taskStatus = '5' ",$TaskSerialno,$AcceptSerialno)->save($data);
   	return $result;

   }

   /**
	 * UpdateOrderId  更新任务订单ID
	 * @param $Serialno  任务流水号
	 * @param $OrderId  订单流水号
	 * @return 更新状态   true =成功,false=失败
	*/

   public function updateOrderId($Serialno,$OrderId)
   {
   	$data['OrderId']=$OrderId;

   return $this->where("taskSerialno = '%s' and taskStatus <> '9' ",$Serialno)->save($data);


   }
   /**
	 * IsAppraiser  查询任务是否已经被评价
	 * @param $Serialno  任务流水号
	 * @return 是否评价   true =已评价,false=未评价
	*/

   public function IsAppraiser($Serialno)
   {

   	$Task = $this->QueryTask($Serialno);  //查询任务信息
   	if($Task['IsAppraiser']==1)    //判断任务评价标识是否为已经评价
   	{
   	return true;   //返回true;
   	}elseif($Task['IsAppraiser']==0)   //判断任务评人偶标识是否为没有评价。
   	{
   	return false;   //返回false
   	}

   }

  public function cancelOperate($TaskSerialno,$Uid,$Cancelid)
  {
  	 $where['taskSerialno']=$TaskSerialno;
  	 $where['releaseUserId']=$Uid;
  	 $data['taskStatus']=8;
  	 $data['CloseTime']=getDateTime();
  	 $data['cancelId']=$Cancelid;
  	return $this->where($where)->save($data);




  }




















}